package org.quincy.mqtt.test;

import org.quincy.mqtt.test.comm.SendFlag;
import org.quincy.mqtt.test.comm.TerminalChannel;
import org.quincy.rock.core.util.StringUtil;

/**
 * <b>服务器端通道。</b>
 * <p><b>详细说明：</b></p>
 * <!-- 在此添加详细说明 -->
 * 无。
 * <p><b>修改列表：</b></p>
 * <table width="100%" cellSpacing=1 cellPadding=3 border=1>
 * <tr bgcolor="#CCCCFF"><td>序号</td><td>作者</td><td>修改日期</td><td>修改内容</td></tr>
 * <!-- 在此添加修改列表，参考第一行内容 -->
 * <tr><td>1</td><td>mex20</td><td>2021年2月5日 下午4:35:06</td><td>建立类型</td></tr>
 * 
 * </table>
 * @version 1.0
 * @author wks
 * @since 1.0
 */
public class ServerChannel extends TerminalChannel {

	/**
	 * serialVersionUID。
	 */
	private static final long serialVersionUID = 1L;

	/** 
	 * fromTopic。
	 * @see org.quincy.rock.comm.mqtt.IMqttTerminalChannel#fromTopic(java.lang.String)
	 */
	@Override
	public TerminalChannel fromTopic(String topic) {
		//解析发送标志
		int bIndex = topic.lastIndexOf(StringUtil.CHAR_SLASH);
		int eIndex = topic.length();
		SendFlag sendFlag = SendFlag.valueOf(topic.substring(bIndex + 1, eIndex).toUpperCase());
		this.sendFlag(sendFlag);
		if (this.isSendChannel()) {
			eIndex = topic.indexOf(StringUtil.CHAR_SLASH);
			if (TestUtils.TOPIC_SVR_PREFIX.equals(topic.substring(0, eIndex))) {
				//发给服务器
				this.setRemoteType(TestUtils.SERVER_TYPE);
				if (sendFlag == SendFlag.RECEIVE) {
					bIndex = eIndex + 1;
					eIndex = topic.indexOf(StringUtil.CHAR_SLASH, bIndex);
					String code = topic.substring(bIndex, eIndex);
					if ("all".equals(code))
						code = null;
					this.setRemoteCode(code);
				} else {
					this.setRemoteCode(null);
				}
			} else {
				bIndex = eIndex + 1;
				eIndex = topic.indexOf(StringUtil.CHAR_SLASH, bIndex);
				this.setRemoteType(Integer.valueOf(topic.substring(bIndex, eIndex)));
				bIndex = eIndex + 1;
				eIndex = topic.indexOf(StringUtil.CHAR_SLASH, bIndex);
				this.setRemoteCode(topic.substring(bIndex, eIndex));
			}
		}
		return this;
	}

	/** 
	 * toTopic。
	 * @see org.quincy.rock.comm.mqtt.IMqttChannel#toTopic()
	 */
	@Override
	public String toTopic() {
		StringBuilder sb = new StringBuilder();
		SendFlag sendFlag = this.sendFlag();
		if (sendFlag == SendFlag.PUBLISH) {
			//发布到服务器公告牌
			sb.append(TestUtils.TOPIC_SVR_PREFIX);
			Integer type = this.getRemoteType();
			if (type == null) {
				sb.append("all");
				sb.append(StringUtil.CHAR_SLASH);
			} else {
				sb.append(type);
				sb.append(StringUtil.CHAR_SLASH);
				String code = this.getRemoteCode();
				if (!StringUtil.isBlank(code)) {
					sb.append(code);
					sb.append(StringUtil.CHAR_SLASH);
				}
			}
		} else if (this.toServer()) {
			sb.append(TestUtils.TOPIC_SVR_PREFIX);
			if (sendFlag == SendFlag.RECEIVE) {
				String code = this.getRemoteCode();
				if (StringUtil.isBlank(code))
					code = "all";
				sb.append(code);
				sb.append(StringUtil.CHAR_SLASH);
			}
		} else {
			sb.append(TestUtils.TOPIC_DEV_PREFIX);
			sb.append(this.getRemoteType());
			sb.append(StringUtil.CHAR_SLASH);
			sb.append(this.getRemoteCode());
			sb.append(StringUtil.CHAR_SLASH);			
		}
		sb.append(sendFlag.name().toLowerCase());
		return sb.toString();
	}
}
